<?php
class WeixinController extends Controller {
	//微信xml对象
	private $WxObj;
	private $appID="wxb1ff1daa8ffe0155";
	private $appsecret="b484beb300e5c43cfa6b5ca3d592042f";
	private $access_token;
	//接口处理方法
	public function index() {
		$token = 'jzxm';
		//			绑定函数
		$this -> verify($token);
		//			获取用户消息对象
		$WxObj = $this -> getWxObj();
		$this -> WxObj = $WxObj;
		//响应写入指定的日志文件
		$logdata = json_encode($_REQUEST);
		$logo=time().":".$logdata."\r\n";
		$logdir="./log";
		is_dir($logdir)||mkdir($logdir,0755,true);
		file_put_contents($logdir.'/wx.log', $logo, FILE_APPEND);
	//获取accessToken()
		$this->access_token=$this->getAccessToken();
	//微信自定义菜单
		$msg=$this->setNav();		
		//处理关键词回复接口
		if ($this -> isText()) {
			//				注意这里的消息有可能有空格符，所以去除前后的空格
			switch(trim($this->WxObj->Content)) {
				case '1' :
					$this -> responseMsg('1杆钢枪交给我');
					break;
				case '2' :
					$this -> responseMsg('2话不说为祖国');
					break;
				case '3':
					$this->responseMsg($this->access_token);
					break;
				case '4':
					$this->responseMsg($msg);
					break;
				default :
					$this -> responseMsg('没有指定的回复消息');
					break;
			}
		}
	//处理微信关注事件
		if($this->is_subscribe()){
			$this->responseMsg('谢谢您的关注');
		}
		
	//处理微信点击事件

		if($this->is_click()){
			//设置微信点击事件响应
			switch(trim($this->WxObj->EventKey)){
				case 'ygzl':
					$data=array(
						array(
						'title'=>'许巍',
						'description'=>'生命不止眼前的苟且,还有诗歌',
						'picurl'=>'http://h.hiphotos.baidu.com/zhidao/pic/item/6a63f6246b600c3320b14bb3184c510fd8f9a185.jpg',
						'url'=>'http:www.baidu.com'
						),
						array(
						'title'=>'郑钧',
						'description'=>'如花般的风马',
						'picurl'=>'http://h.hiphotos.baidu.com/zhidao/pic/item/6a63f6246b600c3320b14bb3184c510fd8f9a185.jpg',
						'url'=>'http:www.baidu.com'						
						),
						array(
						'title'=>'王晓天',
						'description'=>'黑夜给了我黑色的眼睛',
						'picurl'=>'http://h.hiphotos.baidu.com/zhidao/pic/item/6a63f6246b600c3320b14bb3184c510fd8f9a185.jpg',
						'url'=>'http:www.baidu.com'						
						)
					);
					$this->responseArt($data);
				break;
				case 'dz':
					$this->responseMsg('感谢您的支持');
				break;
				default:
					$this->responseMsg('自定义事件没找到');
				break;
			}
		}

	}

	/**
	 * 绑定方法,只用于和服务器的绑定
	 */
	private function verify($token) {
		//接收微信GET传递过来的参数
		$echoStr = $_GET["echostr"];
		$signature = $_GET["signature"];
		$timestamp = $_GET["timestamp"];
		$nonce = $_GET["nonce"];
		//1.将token、timestamp、nonce三个参数进行字典序排序
		$tmpArr = array($token, $timestamp, $nonce);
		sort($tmpArr, SORT_STRING);
		//2.将三个参数字符串拼成一个字符串,进行sha1加密
		$tmpStr = implode($tmpArr);
		$tmpStr = sha1($tmpStr);
		//3.开发者获得加密后的字符串可与signature对比
		if ($tmpStr == $signature && isset($_GET['echostr'])) {
			echo $_GET['echostr'];
		} else {
			return false;
		}
	}

	/*获取用户消息对象
	 *
	 */
	private function getWxObj() {
		//把微信中传递的消息以xml格式传送服务器,存到全局数据中
		//获取xml数
		$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
		file_put_contents('xml.php', $postStr);


		//			xml安全参数
		libxml_disable_entity_loader(true);
		//			获取xml参数转换成php对象
		//			获取到的是一个对象，
		$postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
		return $postObj;
	}

	/**判定类型获取消息
	 *
	 */
	private function isText() {
		//判定是不是一个文本文件
		if ($this -> WxObj -> MsgType == 'text') {
			return true;
		}
		return false;
	}

	/**回复文本数据
	 *
	 */
	private function responseMsg($msg) {
		/*<xml>
		 <ToUserName><![CDATA[toUser]]></ToUserName>
		 <FromUserName><![CDATA[fromUser]]></FromUserName>
		 <CreateTime>12345678</CreateTime>
		 <MsgType><![CDATA[text]]></MsgType>
		 <Content><![CDATA[你好]]></Content>
		 </xml>	 */
		$WxObj = $this -> WxObj;
		$toUser = $WxObj -> FromUserName;
		$fromUser = $WxObj -> ToUserName;
		$time = time();
		$str = <<<str
<xml>
<ToUserName><![CDATA[{$toUser}]]></ToUserName>
<FromUserName><![CDATA[{$fromUser}]]></FromUserName>
<CreateTime>{$time}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[{$msg}]]></Content>
</xml>
str;
		echo $str;

	}
	/**判断是否是关注事件
	 * 
	 */
	 private function is_subscribe(){
	 	if($this->WxObj->MsgType=='event'){
	 		if($this->WxObj->Event=="subscribe"){
	 			return ture;
	 		}
	 	}
		return false;
	 }
	 /**
	  * 获取accesstoken接口函数
	  * @return [type] [description]
	  */
	 private function getAccessToken(){
	 	/**
	 	 * 如果缓存文件已经存在,则直接读取缓存文件,并返回缓存内容
	 	 * 否则则进行Accesstoken请求,并写入缓存文件
	 	 */	 	
	 	$cachename='access_token';
	 	if($accesstoken=$this->cacheGet($cachename)){
	 		return $accesstoken;
	 	}
	 	$url="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=".$this->appID."&secret=".$this->appsecret;
	 	$token=$this->curlGet($url);
	 	//将腾讯返回的json形式的access_token转换为数组
	 	$data=json_decode($token,true);
	 	//判断是否正确返回
	 	if(array_key_exists($data, 'error')&&$data["error"]>0){
	 		return false;
	 	}
	 	//如正确返回则把$data写入到缓存中
	 	$accesstoken=$data["access_token"];
	 	$this->cacheSet($cachename,$accesstoken,7000);
	 	return $accesstoken;

	 }
	
	private function setNav(){
		/**
		 * 
		 */
		$data=[
			"button"=>[
				[
					'type'=>"click",
					'name'=>"摇滚之旅",
					'key'=>"ygzl",					
				],
				[
					'type'=>"view",
					'name'=>"网站域名",
					'url'=>"http://c.dsqjyj.com",					
				],	
				[
					'name'=>"菜单",
					sub_button=>[
						[
							'type'=>"click",
							'name'=>'点一下赞',
							'key'=>'dz'
						],
						[
							"type"=>"pic_photo_or_album", 
		                    "name"=>"拍照或者相册发图", 
		                    "key"=> "rselfmenu_1_1",
						]
					]
				]			
				
			]
		];
		$json=json_encode($data,JSON_UNESCAPED_UNICODE);
		$url='https://api.weixin.qq.com/cgi-bin/menu/create?access_token='.$this->access_token;
		$result=$this->curlPost($url, $json);
/*		echo $url;
		echo "<br>";
		echo $json;
		echo"<br>";
		echo $result;*/
		return $result;
	}
	//判断是不是click事件
	private function is_click(){
		if($this->WxObj->MsgType=="event"){
			if($this->WxObj->Event=="CLICK"){
				return true;
			}
		}
		return false;
	}
	
	//微信返回图文消息
	private function responseArt($data){
		//获取数据
		$touser=$this->WxObj->FromUserName;
		$fromuser=$this->WxObj->ToUserName;
		$createtime=time();
		$count=count($data);
		//拼接返回的xml格式
$str=<<<str
<xml>
<ToUserName><![CDATA[{$touser}]]></ToUserName>
<FromUserName><![CDATA[{$fromuser}]]></FromUserName>
<CreateTime>{$createtime}</CreateTime>
<MsgType><![CDATA[news]]></MsgType>
<ArticleCount>{$count}</ArticleCount>
<Articles>
str;
		foreach ($data as  $v) {
				$str.=<<<con
<item>
<Title><![CDATA[{$v['title']}]]></Title> 
<Description><![CDATA[{$v['description']}]]></Description>
<PicUrl><![CDATA[{$v['picurl']}]]></PicUrl>
<Url><![CDATA[{$v['url']}]]></Url>
</item>
con;
		}
		$str.='</Articles></xml>';
//		file_put_contents("./log/temp.php", $str);
		echo $str;
	}
}